"""
多用户、上下文隔离的聊天机器人
支持：
1. 每用户独立上下文
2. 会话持久化（json）
3. CLI 交互演示
todo 优化：
● 接入 Web（FastAPI + WebSocket）
● 将 sessions 换成 Redis/MySQL，支持分布式部署
● 增加 token 用量统计、自动摘要旧消息等高级功能
"""
import os
import json
import uuid
from pathlib import Path
from openai import OpenAI
from dotenv import load_dotenv

# ----------------------------
# 初始化
# ----------------------------
load_dotenv()
base_url = os.getenv("BASE_URL")
api_key = os.getenv("API_KEY")
model = os.getenv("MODEL")
print(f"OpenAI Base URL: {base_url}")
print(f"OpenAI API Key: {api_key}")
print(f"model: {model}")
client = OpenAI(api_key=api_key, base_url=base_url)

SESSION_DIR = Path("sessions")
SESSION_DIR.mkdir(exist_ok=True)


# ----------------------------
# 会话管理
# ----------------------------
def load_session(user_id: str):
    """读取用户会话历史"""
    file = SESSION_DIR / f"{user_id}.json"
    if file.exists():
        return json.loads(file.read_text(encoding="utf-8"))
    # 默认系统指令
    return [
        {
            "role": "system",
            "content": """
            你是一个精通国外电信与运营商的助手。
            我将输入一批运营商的字段，里面有些其实是某些运营商的子公司或者是别名或者是错误的，请你帮我总结结果。
            请确保你的回答返回的是一个list，list中每个元素是一个dict，每个dict中包含字段'origin_name', 'operator', 'relation_ship'和 'according_to'。
            origin_name和operator的值使用英文返回，relation_ship和according_to的值使用中文返回。
            如果未找到运营商的相关信息，请在relation_ship字段中返回'未知'。
            """
            # 可以限制relation_ship可以返回的字段
            # 可以说明输入的格式是多个运营商连起来的字符串，通过逗号隔开
        }
    ]


def save_session(user_id: str, messages: list):
    """保存用户会话历史"""
    file = SESSION_DIR / f"{user_id}.json"
    file.write_text(json.dumps(messages, ensure_ascii=False, indent=2), encoding="utf-8")


def chat_with_openai(messages: list, model: str = model) -> str:
    """调用 OpenAI ChatCompletion"""
    resp = client.chat.completions.create(
        model=model,
        messages=messages,
        temperature=0.7,
        max_tokens=1024,
        stream=False,
        # response_format={'type': 'json_object'},
    )
    return resp.choices[0].message.content.strip()


# 解析文本
def parse_text(text: str) -> list:
    """解析 API 返回的文本"""
    text = text.strip('```').strip('json')
    return json.loads(text)


# ----------------------------
# CLI 交互演示
# ----------------------------
def cli_demo():
    print("🤖 多用户聊天机器人（输入 exit 退出）")
    user_id = str(uuid.uuid4())  # 也可以改成登录用户名
    print(f"当前用户 ID：{user_id}\n")

    messages = load_session(user_id)

    while True:
        user_input = input("You: ").strip()
        if user_input.lower() in {"exit", "quit"}:
            print("👋 Goodbye!")
            break
        messages.append({"role": "user", "content": user_input})
        assistant_reply = chat_with_openai(messages)
        messages.append({"role": "assistant", "content": assistant_reply})
        save_session(user_id, messages)
        print(f"Bot: {assistant_reply}\n")


if __name__ == "__main__":
    # 测试用例: Ethiopian Telecommunication Corporation, Ethio Telecom, Safaricom-tel, WebSprix IT Solution
    cli_demo()
